package com.zrkizzy.hashmap;

import java.util.HashMap;
import java.util.Map;

/**
 * 383. 赎金信
 *
 * @author zhangrongkang
 * @since 2022/11/24
 * @see <a href="https://leetcode.cn/problems/ransom-note/">https://leetcode.cn/problems/ransom-note/</a>
 */
public class 赎金信 {

    class Solution01 {
        // 哈希表
        public boolean canConstruct(String ransomNote, String magazine) {
            // 定义哈希表
            Map<Character, Integer> map = new HashMap<>();
            // 遍历第二个字符串
            for (Character c : magazine.toCharArray()) {
                // 将当前的字符进行添加
                int count = map.getOrDefault(c, 0);
                map.put(c, ++count);
            }
            // 遍历第一个字符串
            for (Character c : ransomNote.toCharArray()) {
                if (!map.containsKey(c) || map.get(c) == 0) {
                    return false;
                }
                // 将当前使用过的字符进行处理‘
                int count = map.get(c);
                map.put(c, --count);
            }
            return true;
        }
    }

    class Solution02 {
        // 使用数组遍历
        public boolean canConstruct(String ransomNote, String magazine) {
            // 定义数组用于存储每一个字符的数量
            int[] arr = new int[26];
            // 遍历第二个字符串
            for (Character c : magazine.toCharArray()) {
                // 将当前的字符在数组中对应的位置 + 1
                arr[c - 'a'] += 1;
            }
            // 遍历第一个字符串
            for (Character c : ransomNote.toCharArray()) {
                // 将当前字符在数组中对应的位置 - 1
                arr[c - 'a'] -= 1;
            }

            // 遍历存储字符数量的数组，查看是否有小于0的字符
            for (int num : arr) {
                if (num < 0) {
                    return false;
                }
            }
            return true;
        }
    }
}
